package init

import (
	"log"
	"os"
	"path/filepath"
	"strconv"
	"time"
)

// ExportConfig 导出功能配置
var ExportConfig = &exportConfig{
	ExportDir:            "export",
	FileExpiryDays:       0,
	MaxRetryCount:        0,
	BatchSize:            1000,
	FlushInterval:        0,
	MaxExportRecords:     100000,
	EnableFileEncryption: false,
	EncryptionKey:        "",
}

// exportConfig 导出功能的具体配置项
// 这些配置可以从配置文件或环境变量中加载
// 在实际项目中，可以根据需要调整为可配置的形式

type exportConfig struct {
	// ExportDir 导出文件的存储目录
	ExportDir string

	// FileExpiryDays 导出文件的保留天数，过期后可以自动清理
	FileExpiryDays int

	// MaxRetryCount 导出任务的最大重试次数
	MaxRetryCount int

	// BatchSize 单次处理的订单数量
	BatchSize int

	// FlushInterval 写入文件的刷新间隔（秒）
	FlushInterval int

	// MaxExportRecords 单次导出的最大记录数
	MaxExportRecords int

	// EnableFileEncryption 是否启用文件加密
	EnableFileEncryption bool

	// EncryptionKey 用于加密导出文件的密钥
	// 在生产环境中，应该从安全的配置管理系统获取
	EncryptionKey string
}

// InitExportConfig 初始化导出配置
func InitExportConfig() {
	// 默认配置
	ExportConfig.ExportDir = "export_files" // 使用相对路径
	ExportConfig.FileExpiryDays = 7
	ExportConfig.MaxRetryCount = 3
	ExportConfig.BatchSize = 1000
	ExportConfig.FlushInterval = 5
	ExportConfig.MaxExportRecords = 100000 // 增加最大导出记录数
	// 加密相关配置
	ExportConfig.EnableFileEncryption = true                                   // 默认启用文件加密
	ExportConfig.EncryptionKey = "default-encryption-key-for-development-only" // 开发环境默认密钥，生产环境应从安全配置获取

	// 从环境变量加载配置（如果有）
	loadConfigFromEnv()

	// 确保导出目录存在
	if err := os.MkdirAll(ExportConfig.ExportDir, 0755); err != nil {
		log.Printf("创建导出目录失败: %v，使用临时目录", err)
		// 使用系统临时目录作为备选
		ExportConfig.ExportDir = os.TempDir()
		log.Printf("已切换到临时目录: %s", ExportConfig.ExportDir)
	}

	// 验证配置的合理性
	validateConfig()

	// 记录最终的配置值
	log.Printf("导出功能配置已初始化 - 目录: %s, 过期天数: %d, 重试次数: %d, 批次大小: %d, 最大记录数: %d",
		ExportConfig.ExportDir,
		ExportConfig.FileExpiryDays,
		ExportConfig.MaxRetryCount,
		ExportConfig.BatchSize,
		ExportConfig.MaxExportRecords)
}

// loadConfigFromEnv 从环境变量加载配置
func loadConfigFromEnv() {
	// 导出目录
	if dir := os.Getenv("EXPORT_DIR"); dir != "" {
		ExportConfig.ExportDir = dir
	}

	// 文件保留天数
	if days := os.Getenv("EXPORT_FILE_EXPIRY_DAYS"); days != "" {
		if d, err := strconv.Atoi(days); err == nil && d > 0 {
			ExportConfig.FileExpiryDays = d
		}
	}

	// 最大重试次数
	if retries := os.Getenv("EXPORT_MAX_RETRY_COUNT"); retries != "" {
		if r, err := strconv.Atoi(retries); err == nil && r > 0 {
			ExportConfig.MaxRetryCount = r
		}
	}

	// 批次大小
	if batchSize := os.Getenv("EXPORT_BATCH_SIZE"); batchSize != "" {
		if b, err := strconv.Atoi(batchSize); err == nil && b > 0 {
			ExportConfig.BatchSize = b
		}
	}

	// 最大导出记录数
	if maxRecords := os.Getenv("EXPORT_MAX_RECORDS"); maxRecords != "" {
		if m, err := strconv.Atoi(maxRecords); err == nil && m > 0 {
			ExportConfig.MaxExportRecords = m
		}
	}

	// 加密相关配置
	if enableEncrypt := os.Getenv("EXPORT_ENABLE_ENCRYPTION"); enableEncrypt != "" {
		if enable, err := strconv.ParseBool(enableEncrypt); err == nil {
			ExportConfig.EnableFileEncryption = enable
		}
	}

	// 加密密钥
	if key := os.Getenv("EXPORT_ENCRYPTION_KEY"); key != "" {
		ExportConfig.EncryptionKey = key
	}
}

// validateConfig 验证配置的合理性
func validateConfig() {
	// 确保导出目录不为空
	if ExportConfig.ExportDir == "" {
		log.Println("警告：导出目录为空，使用默认临时目录")
		ExportConfig.ExportDir = os.TempDir()
	}

	// 确保文件保留天数合理
	if ExportConfig.FileExpiryDays <= 0 {
		ExportConfig.FileExpiryDays = 7 // 默认保留7天
		log.Println("警告：文件保留天数设置不合理，使用默认值7天")
	}

	// 确保重试次数合理
	if ExportConfig.MaxRetryCount <= 0 {
		ExportConfig.MaxRetryCount = 3 // 默认重试3次
		log.Println("警告：最大重试次数设置不合理，使用默认值3次")
	}

	// 确保批次大小合理
	if ExportConfig.BatchSize <= 0 {
		ExportConfig.BatchSize = 1000 // 默认批次大小1000
		log.Println("警告：批次大小设置不合理，使用默认值1000")
	} else if ExportConfig.BatchSize > 10000 {
		ExportConfig.BatchSize = 10000 // 最大批次大小限制为10000
		log.Println("警告：批次大小过大，已限制为10000")
	}

	// 确保最大导出记录数合理
	if ExportConfig.MaxExportRecords <= 0 {
		ExportConfig.MaxExportRecords = 50000 // 默认最大50000条
		log.Println("警告：最大导出记录数设置不合理，使用默认值50000")
	}

	// 确保加密密钥不为空（如果启用了加密）
	if ExportConfig.EnableFileEncryption && len(ExportConfig.EncryptionKey) < 16 {
		// 警告：在实际生产环境中，应该从安全的配置管理系统获取密钥
		// 这里仅为开发测试提供一个简单的临时密钥
		log.Println("警告：加密密钥太短或未设置，使用默认临时密钥")
		ExportConfig.EncryptionKey = "default-encryption-key-for-development-only"
	}
}

// GetExportFilePath 生成导出文件的完整路径
func GetExportFilePath(taskID string) string {
	// 使用任务ID作为文件名，添加.csv扩展名
	fileName := taskID + ".csv"
	return filepath.Join(ExportConfig.ExportDir, fileName)
}

// GetExportExpiryTime 获取导出文件的过期时间
func GetExportExpiryTime() time.Time {
	return time.Now().Add(-time.Duration(ExportConfig.FileExpiryDays) * 24 * time.Hour)
}
